home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / os2 / octa209s.zip / octave-2.09 / libs / pnm / ps.c < prev    next >
C/C++ Source or Header  |  1997-02-02  |  4KB  |  162 lines

  1. /*
  2. *******************************************************************************
  3. ** Codecs for PS                                                             **
  4. ** (c) Klaus Gebhardt, 1997                                                  **
  5. *******************************************************************************
  6. */
  7.  
  8. #include <stdlib.h>
  9. #include <stdio.h>
  10.  
  11. #include "oct-img.h"
  12.  
  13. #define MARGIN 0.95
  14.  
  15. static BOOL PS_writeheader (FILE *fp, char* name, UINT y, UINT x, INT grey)
  16. {
  17.   INT iy, ix, devpix;
  18.   OCTAVE pixfac, sy, sx, llx, lly, scale = 1.0;
  19.   INT turnflag = 0;
  20.   INT turnokflag = 1;
  21.  
  22.   iy = y;
  23.   ix = x;
  24.   if ( turnflag || ( turnokflag && y > x ) )
  25.     {
  26.       turnflag = 1;
  27.       y = ix;
  28.       x = iy;
  29.     }
  30.  
  31.   devpix = 300.0 / 72.0 + 0.5;
  32.   pixfac = 72.0 / 300.0 * devpix;
  33.  
  34.   sy = scale * y * pixfac;
  35.   sx = scale * x * pixfac;
  36.  
  37.   if ((sy > 612 * MARGIN) || (sx > 762 * MARGIN))
  38.     {
  39.       if (sy > 612 * MARGIN)
  40.     {
  41.       scale *= 612 / sy * MARGIN;
  42.       sy = scale * y * pixfac;
  43.       sx = scale * x * pixfac;
  44.     }
  45.  
  46.       if (sx > 762 * MARGIN)
  47.     {
  48.       scale *= 762 / sx * MARGIN;
  49.       sy = scale * y * pixfac;
  50.       sx = scale * x * pixfac;
  51.     }
  52.     }
  53.  
  54.   llx = (612 - sy) / 2;
  55.   lly = (762 - sx) / 2;
  56.  
  57.   if (fprintf (fp, "%%!PS-Adobe-2.0 EPSF-2.0\n") == EOF)  return -1;
  58.   if (fprintf (fp, "%%%%Creator: PS_Encode\n") == EOF)      return -1;
  59.   if (fprintf (fp, "%%%%Title: %s.ps\n", name) == EOF)    return -1;
  60.   if (fprintf (fp, "%%%%Pages: 1\n") == EOF)              return -1;
  61.   if (fprintf (fp, "%%%%BoundingBox: %d %d %d %d\n", (int) llx, (int) lly,
  62.            (int) (llx + sy + 0.5), (int) (lly + sx + 0.5)) == EOF)
  63.     return -1;
  64.   if (fprintf (fp, "%%%%EndComments\n") == EOF)  return -1;
  65.   if (fprintf (fp, "/readstring {\n") == EOF)    return -1;
  66.   if (fprintf (fp, "  currentfile exch readhexstring pop\n") == EOF)
  67.     return -1;
  68.   if (fprintf (fp, "} bind def\n") == EOF)  return -1;
  69.  
  70.   if (grey == OCT_RGB)
  71.     {
  72.       if (fprintf (fp, "/rpicstr %d string def\n", iy) == EOF)  return -1;
  73.       
  74.       if (fprintf (fp, "/gpicstr %d string def\n", iy) == EOF)  return -1;
  75.       if (fprintf (fp, "/bpicstr %d string def\n", iy) == EOF)  return -1;
  76.     }
  77.   else
  78.     if (fprintf (fp, "/picstr %d string def\n", iy) == EOF)  return -1;
  79.  
  80.   if (fprintf (fp, "%%%%EndProlog\n") == EOF)              return -1;
  81.   if (fprintf (fp, "%%%%Page: 1 1\n") == EOF)              return -1;
  82.   if (fprintf (fp, "gsave\n") == EOF)                      return -1;
  83.   if (fprintf (fp, "%g %g translate\n", llx, lly) == EOF)  return -1;
  84.   if (fprintf (fp, "%g %g scale\n", sy, sx) == EOF)        return -1;
  85.   if (turnflag)
  86.     if (fprintf (fp, "0.5 0.5 translate  90 rotate  -0.5 -0.5 translate\n")
  87.     == EOF)  return -1;
  88.   if (fprintf (fp, "%d %d %d\n", iy, ix, 8) == EOF)              return -1;
  89.   if (fprintf (fp, "[ %d 0 0 -%d 0 %d ]\n", iy, ix, ix) == EOF)  return -1;
  90.  
  91.   if (grey == OCT_RGB)
  92.     {
  93.       if (fprintf (fp, "{ rpicstr readstring }\n") == EOF)  return -1;
  94.       if (fprintf (fp, "{ gpicstr readstring }\n") == EOF)  return -1;
  95.       if (fprintf (fp, "{ bpicstr readstring }\n") == EOF)  return -1;
  96.       if (fprintf (fp, "true 3\n") == EOF)      return -1;
  97.       if (fprintf (fp, "colorimage\n") == EOF)  return -1;
  98.     }
  99.   else
  100.     {
  101.       if (fprintf (fp, "{ picstr readstring }\n") == EOF) return -1;
  102.       if (fprintf (fp, "image\n") == EOF)                 return -1;
  103.     }
  104.  
  105.   return 0;
  106. }
  107.  
  108.  
  109. static BOOL PS_writerow (FILE *fp, INT *r, UINT x, INT n, UCHAR **cm, INT *ct)
  110. {
  111.   UINT i;
  112.   INT c;
  113.  
  114.   for (c = 0; c < n; c++)
  115.     {
  116.       for (i = 0; i < x; i++)
  117.     {
  118.       if (*ct == 30)
  119.         {
  120.           if (fprintf (fp, "\n") == EOF)  return -1;
  121.           *ct = 0;
  122.         }
  123.  
  124.       if (fprintf (fp, "%02X", cm[c][r[i]]) == EOF)  return -1;
  125.       (*ct)++;
  126.     }
  127.     }
  128. }
  129.  
  130.  
  131. static BOOL PS_writerest (FILE *fp)
  132. {
  133.   if (fprintf (fp, "\ngrestore\nshowpage\n%%%%Trailer\n") == EOF)  return -1;
  134.   return 0;
  135. }
  136.  
  137.  
  138. BOOL PS_Encode (FILE *fp, INT grey, UINT x, UINT y, INT **pixels,
  139.         INT colors, UCHAR **cm)
  140. {
  141.   UINT j;
  142.   INT ct = 0;
  143.  
  144.   if (PS_writeheader (fp, "noname", x, y, grey) == -1)  return -1;
  145.  
  146.   for (j = 0; j < y; j++)
  147.     {
  148.       if (grey == OCT_RGB)
  149.     {
  150.       if (PS_writerow (fp, pixels[j], x, 3, cm, &ct) == -1)  return -1;
  151.     }
  152.       else
  153.     {
  154.       if (PS_writerow (fp, pixels[j], x, 1, cm, &ct) == -1)  return -1;
  155.     }
  156.     }
  157.  
  158.   PS_writerest(fp);
  159.  
  160.   return 0;
  161. }
  162.